﻿//-------------------------------------
// WBFSSync - WBFSSync.exe
//
// Copyright 2009 Caian (ÔmΣga Frøst) <frost.omega@hotmail.com> :
//
// WBFSSync is Licensed under the terms of the Microsoft Reciprocal License (Ms-RL)
//
// Program.cs:
//
// Ponto de entrada do aplicativo, força a execução do programa como Administrador
//
//-------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Security.Principal;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace WBFSSync
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(params String[] args)
        {
            //----------------------------------------

            //Só permite uma instância do aplicativo funcionando para evitar conflito de acesso aos dispositivos
            Process[] processes;
            if ((processes = Process.GetProcessesByName(Language.AppName)).Length > 1)
            {
                return;
            }

            //----------------------------------------

            if (!args.Contains("-noelevate"))
            {
                //Força o programa iniciar como administrador se o OS possuir UAC
                if (Environment.OSVersion.Version.Major >= 6) //Vista / Seven / Server 2008, possui UAC
                {
                    WindowsIdentity wi = WindowsIdentity.GetCurrent();
                    WindowsPrincipal wp = new WindowsPrincipal(wi);

                    if (!wp.IsInRole(WindowsBuiltInRole.Administrator))
                    {
                        try
                        {
                            Process Elevated = new Process();
                            Elevated.StartInfo.FileName = Application.ExecutablePath;
                            Elevated.StartInfo.Verb = "runas";
                            Elevated.Start();
                        }
                        catch
                        {
                        }

                        return;
                    }
                }
            }

            if (!args.Contains("-noupdate"))
            {
                if (System.IO.Directory.Exists(ProgramUpdate.UpdateFolder) &&
                    System.IO.Directory.GetDirectories(ProgramUpdate.UpdateFolder).Length > 0)
                {
                    Process.Start("updater.exe");
                    return;
                }
            }

            //----------------------------------------

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            //---------------

            Log.Begin();

            if (args.Contains("-nolastchanceexception")) //Força o debugger a pegar as exceções, para debug apenas.
            {
                Application.Run(new FormWBFSSync());
            }
            else
            {
                try //Pega qualquer exceção que eventualmente escape de um try{}catch{}
                {
                    Application.Run(new FormWBFSSync());
                }
                catch (Exception e)
                {
                    Log.LogException(e);
                    MessageBox.Show(Language.exception_lastchance, Language.AppName, MessageBoxButtons.OK,
                        MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                }
            }

            Log.End();
        }
    }
}
